#−∗− coding: utf−8−∗−
#Autor: Vitor Letras n.º 3947

from sqlalchemy import *
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

"""
    Neste módulo cada Class está associada a uma tabela da base de dados,
    e cada instância da class (objecto) representa uma linha da respectiva tabela.
"""


class Instituicao(Base):
    __tablename__ = 'Instituicao'
    """
        Nesta class é associada a tabela Instituicao
        com o campos cod_instituicao e nome_instituicao ambos do tipo String
    """

    cod_instituicao = Column(String(5), primary_key=True)
    nome_instituicao = Column(String(200), unique = True)

    curso_instituicao = relationship("CursoInstituicao", order_by = "CursoInstituicao.id", backref = "Instituicao")

    def __init__(self, cod_instituicao, nome_instituicao):
        self.cod_instituicao = cod_instituicao
        self.nome_instituicao = nome_instituicao

    def __repr__(self):
        return ("<Instituicao('%s', '%s')>" % (self.cod_instituicao, self.nome_instituicao)).encode('utf-8')


class Grau(Base):
    __tablename__ = 'Grau'
    """
        Nesta classe é associada a tabela Grau
        Com os campos cod_grau do tipo inteiro e nome_grau do tipo String
    """
    cod_grau = Column(Integer, Sequence('user_id_seq'), primary_key = True)
    nome_grau = Column(String(100), unique = True)

    curso = relationship("Curso", order_by = "Curso.cod_curso", backref = "Grau")

    def __init__(self, nome_grau):
        self.nome_grau = nome_grau

    def __repr__(self):
        return ("<Grau('%s')>" % (self.nome_grau)).encode('utf-8')


class Curso(Base):
    __tablename__ = 'Curso'
    """
        Nesta classe é definida a tabela Curso
        Com os campos cod_curso e nome_curso ambos do tipo String
        e o campo cod_grau como chave estrangeira da tabela Grau
    """

    cod_curso = Column(String(10), primary_key = True)
    nome_curso = Column(String(200))
    cod_grau = Column(Integer, ForeignKey('Grau.cod_grau'))

    grau = relationship("Grau", backref = backref('Curso', order_by = cod_curso))
    curso_instituicao = relationship("CursoInstituicao", order_by = "CursoInstituicao.id", backref = "Curso")

    def __init__(self, cod_curso, nome_curso, cod_grau):
        self.cod_curso = cod_curso
        self.nome_curso = nome_curso
        self.cod_grau = cod_grau

    def __repr__(self):
        return ("<Curso('%s', '%s')>" % (str(self.cod_curso), self.nome_curso)).encode('utf-8')


class CursoInstituicao(Base):
    __tablename__ = 'CursoInstituicao'
    """
        Nesta classe é associada a tabela CursoInstituicao
        com os campos id inteiro
        Os campos cod_instituicao[Chave Estrangueira] e cod_curso[Chave Estrangueira] do tipo String
        E os campos vagas_iniciais, colocados, nota_ultimo e vagas_sobrantes do tipo Inteiro.
    """

    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    cod_instituicao = Column(String(5), ForeignKey('Instituicao.cod_instituicao'))
    cod_curso = Column(String(10), ForeignKey('Curso.cod_curso'))
    vagas_iniciais = Column(Integer)
    colocados = Column(Integer)
    nota_ultimo = Column(Integer)
    vagas_sobrantes = Column(Integer)

    instituicao = relationship("Instituicao", backref = backref('CursoInstituicao', order_by = id))
    curso = relationship("Curso", backref = backref('CursoInstituicao', order_by = id))

    def __init__(self, cod_instituicao, cod_curso, vagas_iniciais, colocados, nota_ultimo, vagas_sobrantes):
        self.cod_instituicao = cod_instituicao
        self.cod_curso = cod_curso
        self.vagas_iniciais = vagas_iniciais
        self.colocados = colocados
        self.nota_ultimo = nota_ultimo
        self.vagas_sobrantes = vagas_sobrantes

    def __repr__(self):
        return ("<CursoInstituicao('%s', '%s')>" % (str(self.cod_instituicao), str(self.cod_curso))).encode('utf-8')

